package cn.bugstack.springframework.aop;


import cn.bugstack.springframework.util.ClassUtils;

/**
 * 代理目标源类，用于封装和提供被代理目标对象的相关信息。
 */
public class TargetSource {

    // 被代理的目标对象
    private final Object target;

    /**
     * 构造函数，用于初始化被代理的目标对象。
     *
     * @param target 被代理的目标对象。
     */
    public TargetSource(Object target) {
        this.target = target;
    }

    /**
     * 获取目标对象实现的接口数组。
     * 这个目标对象target可能是由JDK代理创建的，也可能是由Cglib创建的。
     * 为了正确地获得结果，需要进行判断，以便于找到正确地对象接口。
     * @return 返回目标对象实现的接口数组。
     */
    public Class<?>[] getTargetClass() {
        Class<?> clazz = this.target.getClass();
        clazz = ClassUtils.isCglibProxyClass(clazz) ? clazz.getSuperclass() : clazz;
        return clazz.getInterfaces();
    }

    /**
     * 获取被代理的目标对象。
     *
     * @return 返回被代理的目标对象。
     */
    public Object getTarget(){
        return this.target;
    }
    
}
